package day17.UDP_TCPdemo.TCP.CS;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;


public class ServerReader extends Thread
{
    private Socket socket;//这个接的是与客户端的socket连接上的服务端的socket
    public ServerReader(Socket Socket)
    {
        this.socket=Socket;
    }
    @Override
    public void run()//任务代码
    {
        try {
// 客户端通过输出流发送数据，然后通过服务端通过输入流读取到服务端
            DataInputStream dis = new DataInputStream(socket.getInputStream());////传进来的管道具有输入流管道是他的性质，我只是转化成一个更符合我目的的流

            while(true)
            {   //dis是由服务端的socket管道的输入流构造出来的，一旦客户端关闭就是输入exit，客户端的socket断开，服务端的socket（与客户端的socket连接上的）也会收到一个关闭事件，而我的dis可以说是由服务端的socket的输入流（管道）构造来的，
                // 所以说一旦客户端socket（管道）断开，服务端的socket会收到一个关闭事件再使用readutf就抛异常了，那么dis的这个方法的对象怎么去等客户端的输出流来发送的信息
                // 服务端的socket已经接收到了他的关闭事件，那么你再通过拿这个管道的输入流，并且去尝试读入岂不是太荒谬了。服务端与这个断开的客户端的socket拼接的socket要被回收了，反正你就是不能用了。那么dis自然就非法了
                System.out.println(dis.readUTF());//等着（阻塞）客户端发送的String数据,一旦断开连接就会抛异常了，那就是客户端断开了
                System.out.println("id:"+socket.getLocalAddress().getHostAddress());
                System.out.println("port:"+socket.getPort());

                System.out.println("*************************************");
            }

        } catch (Exception e) {
           // e.printStackTrace();
         //   System.out.println("一个客户端下线了"+socket.getInetAddress().getHostAddress());
            System.out.println("bus");
        }
    }
}
